#include<iostream>
#include<vector>
#include<queue>

using namespace std;

class Node {
public:
    int val; // 节点存储的值
    vector<Node*> children; // 子节点列表

    Node() {} // 默认构造函数

    Node(int _val) {
        val = _val; // 构造函数，初始化节点值
    }

    Node(int _val, vector<Node*> _children) {
        val = _val; // 构造函数，初始化节点值和子节点列表
        children = _children;
    }
};

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        queue<Node*> que; // 用于层序遍历的队列
        if(root != NULL) que.push(root); // 如果根节点不为空，加入队列
        vector<vector<int>> result; // 存储层序遍历结果的二维向量

        while(!que.empty()){
            int size = que.size(); // 当前层的节点数量
            vector<int> vec; // 存储当前层的值
            for(int i = 0; i < size; i++){
                Node* node = que.front(); // 获取当前队列的第一个节点
                que.pop(); // 从队列中移除该节点
                vec.push_back(node->val); // 将节点的值加入到当前层的结果中
                // 遍历当前节点的所有子节点，并将它们加入队列
                for(Node* child : node->children)
                    if(child) 
                        que.push(child);
            }
            result.push_back(vec); // 将当前层的结果加入到最终结果中
        }
        return result;
    }
};


int main()
{
    Node* root = new Node(1); // N叉树每个节点可以拥有任意数量的子节点
    Node* child1 = new Node(3);
    Node* child2 = new Node(2);
    Node* child3 = new Node(4);
    Node* child4 = new Node(5);
    Node* child5 = new Node(6);

    child3->children = {child4, child5};
    root->children = {child1, child2, child3};

    Solution s;
    vector<vector<int>> result = s.levelOrder(root);
    
    for(const auto& level : result){
        cout << "[";
        for(size_t i = 0; i < level.size(); i++){
            cout << level[i];
            if(i != level.size() - 1) cout << ",";
        }
        cout << "]";
    }
    cout << "]" << endl;
    return 0;
}